/* 
 *  Incub - incubate your baby robot
 *  Copyright (C) 2008 Stanislaw Szymczyk
 *  e-mail: sszymczy@gmail.com   www: http://cogville.cog-lab.com
 *
 *  This file is part of Incub.
 *
 *  Incub is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  Incub is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Incub.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */
 
#ifndef ENACTION_H_
#define ENACTION_H_

#include "Xmlable.h"
#include "World.h"
#include "Shape.h"
#include "Sphere.h"
#include "Cylinder.h"
#include "Capsule.h"
#include "Box.h"
#include "Plane.h"
#include "Entity.h"
#include "Light.h"
#include "Motor.h"
#include "VelocityControlledMotor.h"
#include "TorqueControlledMotor.h"
#include "Joint.h"
#include "FixedJoint.h"
#include "BallJoint.h"
#include "HingeJoint.h"
#include "UniversalJoint.h"
#include "Sensor.h"
#include "TactileMatrix.h"
#include "TactileSensor.h"
#include "Camera.h"
#include "AngularVelocimeter.h"
#include "LinearVelocimeter.h"
#include "PositionSensor.h"

#include "PhysicalShape.h"
#include "TactileShape.h"
#include "PhysicalSensor.h"
#include "PhysicalMotor.h"
#include "CommunicableSensor.h"
#include "CommunicableMotor.h"
#include "PhysicalJoint.h"
#include "Drawable.h"

class TransformableImpl : public Transformable {
};

REF_CLASS_DECLARE(Transformable, REF_SETTER_DECLARE(Position) REF_SETTER_DECLARE(Rotation));

class MaterialImpl : public Material {
};

REF_CLASS_DECLARE(Material, REF_SETTER_DECLARE(Name) REF_SETTER_DECLARE(Ambient) REF_SETTER_DECLARE(Specular) REF_SETTER_DECLARE(Diffuse) REF_SETTER_DECLARE(Emission) REF_SETTER_DECLARE(Shininess) REF_SETTER_DECLARE(Density) REF_SETTER_DECLARE(Resilience) REF_SETTER_DECLARE(Damping) REF_SETTER_DECLARE(Friction))

class ShapeImpl : public Shape {
};

REF_CLASS_DECLARE(Shape, REF_SUPER(Transformable) REF_SETTER_DECLARE(Material));

class CylinderImpl : public Cylinder, public DrawableShape<Cylinder>, public PhysicalShape<Cylinder>, public TactileShape<Cylinder> {
};

REF_CLASS_DECLARE(Cylinder, REF_SETTER_DECLARE(Radius) REF_SETTER_DECLARE(Length) REF_SUPER(Shape));

class CapsuleImpl : public Capsule, public DrawableShape<Capsule>, public PhysicalShape<Capsule>, public TactileShape<Capsule> {
};

REF_CLASS_DECLARE(Capsule, REF_SETTER_DECLARE(Radius) REF_SETTER_DECLARE(Length) REF_SUPER(Shape));

class BoxImpl : public Box, public DrawableShape<Box>, public PhysicalShape<Box>, public TactileShape<Box> {
};

REF_CLASS_DECLARE(Box, REF_SETTER_DECLARE(Size) REF_SUPER(Shape));

class PlaneImpl : public Plane, public DrawableShape<Plane>, public PhysicalShape<Plane> {
};

REF_CLASS_DECLARE(Plane, REF_SETTER_DECLARE(Size) REF_SUPER(Shape));

class SphereImpl : public Sphere, public DrawableShape<Sphere>, public PhysicalShape<Sphere>, public TactileShape<Sphere> {
};

REF_CLASS_DECLARE(Sphere, REF_SETTER_DECLARE(Radius) REF_SUPER(Shape));

class EntityImpl : public Entity {};

REF_CLASS_DECLARE(Entity,REF_SETTER_DECLARE(Name) REF_SETTER_DECLARE(Still) REF_ADDER_DECLARE(Shape) REF_SUPER(Transformable) REF_ADDER_DECLARE(Joint) REF_ADDER_DECLARE(Sensor));

class LightImpl : public Light {};

REF_CLASS_DECLARE(Light, REF_SETTER_DECLARE(Ambient) REF_SETTER_DECLARE(Specular) REF_SETTER_DECLARE(Diffuse) REF_SUPER(Entity))

class MotorImpl : public Motor {
};

REF_CLASS_DECLARE(Motor, REF_SETTER_DECLARE(Axis) REF_SETTER_DECLARE(LoStop) REF_SETTER_DECLARE(HiStop) REF_SETTER_DECLARE(Bounciness));

class VelocityControlledMotorImpl : public VelocityControlledMotor, public PhysicalMotor<VelocityControlledMotor>, public CommunicableMotor<VelocityControlledMotor> {
};

REF_CLASS_DECLARE(VelocityControlledMotor, REF_SUPER(Motor));

class TorqueControlledMotorImpl : public TorqueControlledMotor, public PhysicalMotor<TorqueControlledMotor>, public CommunicableMotor<TorqueControlledMotor> {
};

REF_CLASS_DECLARE(TorqueControlledMotor, REF_SUPER(Motor));

class JointImpl : public Joint {};

REF_CLASS_DECLARE(Joint, REF_SETTER_DECLARE(Anchor) REF_TYPED_SETTER(Entity) REF_ADDER_DECLARE(Motor));

class FixedJointImpl : public FixedJoint, public PhysicalJoint<FixedJoint> {
};

REF_CLASS_DECLARE(FixedJoint, REF_SUPER(Joint));

class HingeJointImpl : public HingeJoint, public PhysicalJoint<HingeJoint> {
};

REF_CLASS_DECLARE(HingeJoint, REF_SUPER(Joint));

class BallJointImpl : public BallJoint, public PhysicalJoint<BallJoint> {
};

REF_CLASS_DECLARE(BallJoint, REF_SUPER(Joint));

class UniversalJointImpl : public UniversalJoint, public PhysicalJoint<UniversalJoint> {
};

REF_CLASS_DECLARE(UniversalJoint, REF_SUPER(Joint));

class SensorImpl : public Sensor {
};

REF_CLASS_DECLARE(Sensor, REF_SUPER(Transformable));

class CameraImpl : public Camera, public CommunicableSensor<Camera>, public PhysicalSensor<Camera> {
};

REF_CLASS_DECLARE(Camera, REF_SETTER_DECLARE(Display) REF_SETTER_DECLARE(Type) REF_SETTER_DECLARE(Resolution) REF_SETTER_DECLARE(ZNear) REF_SETTER_DECLARE(ZFar) REF_SUPER(Sensor));

class AngularVelocimeterImpl : public AngularVelocimeter, public PhysicalSensor<AngularVelocimeter>, public CommunicableSensor<AngularVelocimeter> {
};

REF_CLASS_DECLARE(AngularVelocimeter, REF_SUPER(Sensor));

class LinearVelocimeterImpl : public LinearVelocimeter, public PhysicalSensor<LinearVelocimeter>, public CommunicableSensor<LinearVelocimeter> {
};

REF_CLASS_DECLARE(LinearVelocimeter, REF_SUPER(Sensor));

class TactileMatrixImpl : public TactileMatrix, public PhysicalSensor<TactileMatrix>, public CommunicableSensor<TactileMatrix> {
};

REF_CLASS_DECLARE(TactileMatrix, REF_SETTER_DECLARE(ShapeIndex) REF_ADDER_DECLARE(TactileSensor) REF_SUPER(Sensor) REF_SETTER_DECLARE(TouchResolution));

class TactileSensorImpl : public TactileSensor, public PhysicalSensor<TactileSensor>, public CommunicableSensor<TactileSensor> {
};

REF_CLASS_DECLARE(TactileSensor, REF_SETTER_DECLARE(ShapeIndex) REF_SUPER(Sensor));

class PositionSensorImpl : public PositionSensor, public PhysicalSensor<PositionSensor>, public CommunicableSensor<PositionSensor> {
};

REF_CLASS_DECLARE(PositionSensor, REF_SUPER(Sensor));

class WorldImpl : public World {
};

REF_CLASS_DECLARE(World, REF_ADDER_DECLARE(Entity) REF_ADDER_DECLARE(Material) REF_SETTER_DECLARE(Step));

#endif /*ENACTION_H_*/
